/**
 * @file dbmaterial.h
 * @brief Реализация класса материала, считываемого из СУБД SQLite.
 * 
 * @sa common.h
 * @version 0.1
 * @copyright MIT License
 * @author А.В. Лепихов
 * @date 2012
 */
 
#ifndef _DBMATERIAL_H_
#define _DBMATERIAL_H_

#include <database.h>
#include <material.h>
#include <string>

using namespace std;

/**
 * @brief Код ошибки обращения к БД.
 */
enum DBError_t {
	/** Материал не найден */
	MATERIAL_NOT_FOUND		= -1,
	/** В БД присутствует более одного материала для данного номера */
	DB_ISNT_CONSISTENT		= -2,
	/** В таблице плотности нет значений для данного материала */
	DENSITY_NOT_FOUND		= -3,
	/** В таблице теплоёмкости нет значений для данного материала */
	CP_NOT_FOUND			= -4,
	/** В таблице теплопроводности нет значений для данного материала */
	LAMBDA_NOT_FOUND		= -5,
	/** Файл базы данных не найден */
	DBFILE_NOT_FOUND		= -6,
	/** Значение температуры выходит за пределы диапазона */
	TEMP_OUT_OF_RANGE		= -7
};

/**
 * @brief Тип исключения для ошибки доступа к БД.
 */
struct DBError {
	/** Номер ошибки */
	DBError_t i;
	/** Конструктор исключения */
	DBError(DBError_t ii) {i=ii;}
};

/** Материал, загружаемый из встроенной БД SQLite */
class DBMaterial: public CMaterial {
	double Tdestr;
	double A;
	double B;
	double type;
	func_points_t EPS;
	func_points_t rho;
	func_points_t Cp;
	func_points_t lambda;
public:
	/**
	 * @brief Конструктор класса. Загружает свойства класса из встроенной БД.
	 * @param mid - уникальный номер материала в БД.
	 * @param dbfilename - имя файла БД.
	 * @param flog - указатель на дескриптор открытого устройства вывода.
	 * @details В нештатных ситуациях генерируется исключение типа DBError_t.
	 * @sa DBError_t
	 */
	DBMaterial(int mid, const string dbfilename, FILE* flog = stdout);
	virtual double l(double T) const;
	/** Heat Specific heat.
	 * @param T - current temperature.
	 */
	virtual double c(double T) const;
	/** density.
	 * @param T - current temperature.
	 */
	virtual double r(double T) const;
	/** Emissivity.
	 * @param T - current temperature.
	 */
	virtual double eps(double T) const;
	/** Ablation A-coefficient.
	 * @param T - current temperature.
	 */
	virtual double a(double T) const;
	/** Ablation B-coefficient.
	 * @param T - current temperature.
	 */
	virtual double b(double T) const;
	/** Ablation Heat Integral from T=0 temperature.
	 * @param T - current temperature.
	 */
	virtual double heatQuantity(double T) const;
	/** Print material info.
	 * @param pointer to the output device.
	 */
	virtual void print(FILE *out);
};

#endif /* _DBMATERIAL_H_ */
